package Docker

import (
    "context"
    "os"
    "bufio"

    "github.com/docker/docker/api/types" 
    "github.com/docker/docker/client"
    "github.com/docker/docker/api/types/container"
    "time"
    "fmt"
    // "bufio"
    "strings"
)

func Docker_stop_container()  {
    // 创建Docker客户端
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    _, err = cli.Ping(context.Background())
	if err != nil {
		fmt.Println(Red,"Docker未运行,请启动后再执行", Reset)
		time.Sleep(2 * time.Second)
		return
	}
    ctx := context.Background()
    if err != nil {
        panic(err)
    }
    // 获取真正的容器ID
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }
    //判断是否有容器，没有则返回
    if len(containers) == 0 {
        //黄色
        fmt.Println(Yellow,"没有容器,请使用命令行运行容器", Reset)
        time.Sleep(2 * time.Second)
        return
    }
    Docker_list_container( false ,false)
   
    // 用户输入容器名字
    // 从标准输入中获取要查找的容器名称前缀
    // reader := bufio.NewReader(os.Stdin)
    var containerName string
    for len(strings.TrimSpace(containerName)) == 0 {
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("请输入要停止的容器名字(CTRL+C中断): ")
        containerName, _ = reader.ReadString('\n')
        containerName = strings.TrimSpace(containerName)

        if len(containerName) == 0 {
            //红色字体
            fmt.Println(Red,"输入错误，请重新输入",Reset)
            time.Sleep(1 * time.Second)
            continue
        }
    }
    //查找容器
    var targetContainer types.Container
    for _, c := range containers {
        if c.Names[0] == "/"+containerName {
            targetContainer = c
            break
        }
    }
    // 如果没有找到匹配的容器，直接退出
    if targetContainer.ID == "" {
        //黄色
        fmt.Println(Yellow,"没有找到匹配的容器",Reset)
        time.Sleep(2 * time.Second)
        return
    }
    // 停止容器
    stopOpts := &container.StopOptions{}
    if err := cli.ContainerStop(ctx, targetContainer.ID, *stopOpts); err != nil {
        panic(err)
    }
    // 输出提示信息
    //检测容器状态
    inspect, err := cli.ContainerInspect(ctx, targetContainer.ID)
    if err != nil {
        panic(err)
    }
    if inspect.State.Running == false {
        fmt.Println("容器已停止")
    } else {
        fmt.Println("容器未停止")
    }
    //询问是否删除容器
    var choice string
    fmt.Printf("是否删除容器？(y/n)")
    fmt.Scanln(&choice)
    if choice == "y" {
        // 删除容器
        if err := cli.ContainerRemove(ctx, targetContainer.ID, types.ContainerRemoveOptions{}); err != nil {
            panic(err)
        }
        fmt.Println("容器已删除")
    } else {
        fmt.Println("容器未删除")
    }
    time.Sleep(2 * time.Second)
}

func Docker_start_container () {
    // 创建 Docker 客户端
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    ctx := context.Background()
    //列出所有容器
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{All: true})
    if err != nil {
        panic(err)
    }
    if len(containers) == 0 {
        //黄色
        fmt.Println(Yellow,"没有容器,请使用命令行运行容器", Reset)
        time.Sleep(2 * time.Second)
        return
    }
    Docker_list_container(true,false)
    // 从标准输入中获取要启动的容器名称
    //判断是否为空
    var containerName string
    for len(strings.TrimSpace(containerName)) == 0 {
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("请输入要启动的容器名字(CTRL+C中断): ")
        containerName, _ = reader.ReadString('\n')
        containerName = strings.TrimSpace(containerName)

        if len(containerName) == 0 {
            //红色字体
            fmt.Println(Red,"输入错误，请重新输入",Reset)
            time.Sleep(1 * time.Second)
            continue
        }
    }
    //查找容器
    var targetContainer types.Container
    for _, c := range containers {
        if c.Names[0] == "/"+containerName {
            targetContainer = c
            break
        }
    }
    // 如果没有找到匹配的容器，直接退出
    if targetContainer.ID == "" {
        //黄色
        fmt.Println(Yellow,"没有找到匹配的容器",Reset)
        time.Sleep(2 * time.Second)
        return
    }
    // 获取容器信息
    containerInfo, err := cli.ContainerInspect(ctx, containerName)
    if err != nil {
        //红色字体
        fmt.Println(Red,"获取容器信息失败", err, Reset)
        time.Sleep(2 * time.Second)
    }

    // 如果容器已经在运行，则直接返回
    if containerInfo.State.Running {
        fmt.Println("容器已经在运行中")
        time.Sleep(2 * time.Second)
        return
    }

    // 启动容器
    if err := cli.ContainerStart(ctx, containerName, types.ContainerStartOptions{}); err != nil {
        //红色字体
        fmt.Println(Red,"启动容器失败", err, Reset)
        time.Sleep(2 * time.Second)
    }

    time.Sleep(2 * time.Second)
}